package com.sxyjhh.dbutil.basic;

import lombok.extern.log4j.Log4j;
import org.apache.commons.dbcp2.BasicDataSource;

import javax.annotation.PreDestroy;
import java.sql.SQLException;

/**
 * Description:数据源类
 *
 * @JDK Version:1.8.0_40
 * Version: V1.0
 * Author: wangchun
 * Date: 2016/3/29 10:47
 */
@Log4j
public class CustomDataSource {

    private BasicDataSource bds = new BasicDataSource();

    public CustomDataSource(String driverName, String dbUrl, String userName, String password, int connPollSize) {
        //设置驱动名
        bds.setDriverClassName(driverName);
        //设置数据库连接
        bds.setUrl(dbUrl);
        //设置数据库用户名
        bds.setUsername(userName);
        //设置数据库密码
        bds.setPassword(password);
        //设置数据库连接池
        bds.setInitialSize(connPollSize <= 0 ? 5 : connPollSize);
        //连接池中可同时连接的最小的连接数
        bds.setMinIdle(5);
        //连接池中可同时连接的最大的连接数，为0则表示没有限制，默认为8
        bds.setMaxIdle(0);
        //可以在这个池中同时被分配的有效连接数的最大值，如设置为负数，则不限制
        bds.setMaxTotal(-1);

        //超时时间(以秒数为单位)
        bds.setRemoveAbandonedTimeout(180);
        //超时回收时间(以毫秒为单位)
        bds.setMaxWaitMillis(2000);

        //设置Oracle连接超时时间
//        bds.addConnectionProperty("oracle.net.CONNECT_TIMEOUT", "10000");
//        bds.addConnectionProperty("oracle.jdbc.ReadTimeout", "10000");

        //是否在自动回收超时连接的时候打印连接的超时错误
        bds.setLogAbandoned(true);
    }

    public void setBds(BasicDataSource bds) {
        this.bds = bds;
    }

    public BasicDataSource getBds() {
        return bds;
    }

    @PreDestroy
    public void preDestroy() {
        try {
            bds.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void closeDataSource() throws SQLException {
        bds.close();
    }

}
